Julia

科学技術計算に特化した言語。

あたりが売り。
これらはLLVM上で動くJIT(Just In Time)コンパイラによって実現されている。

普通の数式のような書式でプログラムが書けるのが特徴で、識別子にUnicodeの大量の文字が使えたりする。

幺(Yao)

量子計算シミュレータ。
「幺」という名前の由来は “Yao (幺) is the Chinese character for normalized but not orthogonal.”とのこと(出典)。

といいかんじ。Juliaに慣れてさえいれば使いやすそう。

例:量子フーリエ変換(Quantum Fourier Transformation, QFT)

公式チュートリアルのQuantum Fourier Transformation and Phase Estimationより。

using Yao

#=
量子フーリエ変換の回路qft(n)を作成する
qubitのindexは1-originであることに注意
小さな回路を組み合わせて作っていく
=#
A(i, j) = control(i, j=>shift(2π/(1<<(i-j+1)))) # i番目のqubitをcontrol qubitにしてj番目に位相回転を施す
B(n, k) = chain(n, j==k ? put(k=>H) : A(j, k) for j in k:n) # Pythonのリスト内包表記風にループさせられる
qft(n) = chain(B(n, k) for k in 1:n)

#=
外部ブロック(external block)に上記の回路をラップする
こうすると(上のような函数としての量子回路より)複雑なことが出来る
=#
struct QFT{N} <: PrimitiveBlock{N} end # PrimitiveBlock{N}のサブタイプとしてQFT{N}を作る
QFT(n::Int) = QFT{n}() # 構築用の函数を作る(ほとんどエイリアスでしかない)

# circuitという名の函数を作る
# 引数の型だけが必要なので::の前の変数名を略している
circuit(::QFT{N}) where N = qft(N)

YaoBlocks.mat(::Type{T}, x::QFT) where T = mat(T, circuit(x)) #QFT{N}型の行列を取得する函数を作る

# 以上のようにすると
# QFT(5)' のようにして回路の随伴がとれる(=逆フーリエ変換が作れる)などの恩恵がある

#=
(量子でない)高速フーリエ変換による検算
=#
using FFTW, LinearAlgebra
# 普通の逆高速フーリエ変換で量子フーリエ変換はシミュレートできる
# apply!函数を作っておくと、ブロックが量子状態をパイプで受け取ったときにその回路を適用できる
function YaoBlocks.apply!(r::ArrayReg, x::QFT)
    α = sqrt(length(statevec(r)))
    invorder!(r)
    lmul!(α, ifft!(statevec(r)))
    return r
end

# 比較による検算
r = rand_state(5)
r1 = r |> copy |> QFT(5) # 逆高速フーリエ変換
r2 = r |> copy |> circuit(QFT(5)) # 量子フーリエ変換
r1  r2 # これがtrueを返すならOK

最終更新: 2020-02-04 17:59:22 +0900

[Top]

This page is generated by sinanoki.